package cn.itcast.bos.web.action.teke_delivary;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;

import cn.itcast.bos.utils.BaseAction;

@ParentPackage("json-default")
@Namespace("/")
@Controller
@Scope("prototype")
public class ImageAction extends BaseAction<Object> {

	private File imgFile;
	private String imgFileFileName;   // 这样获取上传文件的名字 和  类型   是因为 在Struts2 中   的拦截器所要求规定的。   比必要这样写  。
	private String imgFileContentType;

	public void setImgFile(File imgFile) {
		this.imgFile = imgFile;
	}

	public void setImgFileFileName(String imgFileFileName) {
		this.imgFileFileName = imgFileFileName;
	}

	public void setImgFileContentType(String imgFileContentType) {
		this.imgFileContentType = imgFileContentType;
	}

	@Action(value = "image_upload", results = { @Result(name = "success", type = "json") })
	public String uplode() throws IOException {
		System.out.println("上传文件" + imgFile);
		System.out.println("文件名" + imgFileFileName);
		System.out.println("文件类型" + imgFileContentType);

		// 将文件进行保存 //在获取的是什么？？？？
		String savepath = ServletActionContext.getServletContext().getRealPath("/upload/");
		String saveurl = ServletActionContext.getRequest().getContextPath() + "/upload/"; /// 这段换区的是什么？？？
		// 生成随机图片名
		UUID uuid = UUID.randomUUID();
		// substring 和lastIndexof 的意思？？？？？
		String ext = imgFileFileName.substring(imgFileFileName.lastIndexOf("."));
		String newfilename = uuid + ext;
		// 保存文件 （保存使用的是绝对路径 ）
		File randomurl = new File(savepath + "/" + newfilename);
		System.out.println(randomurl);
		FileUtils.copyFile(imgFile, randomurl);

		// 通知浏览器文件上传成功
		// 文件上传成功 返回信息给 页面
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("error", 0);
		// 对客户端返回信息的路径 （相对路径）
		result.put("url", saveurl + newfilename);
		// 将结果也如值栈
		ActionContext.getContext().getValueStack().push(result);
		return SUCCESS;
	}

	// 在前台页面显示 已存储的图片
	@Action(value = "image_manage", results = { @Result(name = "success", type = "json") })
	public String manage() {

		// 根目录路径 可以指定绝对路径 比如： d:/xxx/upload/xxx.jpg
		String rootPath = ServletActionContext.getServletContext().getRealPath("/") + "upload/";
		// 跟目标URL 可以指定绝对路径 比如： http://www.yoursite.com/attached/
		String rootUrl = ServletActionContext.getRequest().getContextPath() + "/upload/";

		// 遍历目录取的文件信息 /// 为什么List 里面是 Map??
		List<Map<String, Object>> fileList = new ArrayList<Map<String, Object>>();
		// 当前上传目录
		File currentPathFile = new File(rootPath); // -------------rootPath
													// 是什么？？？？
		// 图片扩展名
		String[] fileTypes = new String[] { "gif", "jpg", "jpeg", "png", "bmp" };

		if (currentPathFile.listFiles() != null) {
			for (File file : currentPathFile.listFiles()) {
				Map<String, Object> hash = new HashMap<String, Object>();
				String fileName = file.getName();
				if (file.isDirectory()) {
					hash.put("is_dir", true);
					hash.put("has_file", (file.listFiles() != null));
					hash.put("filesize", 0L);
					hash.put("is_photo", false);
					hash.put("filetype", "");
				} else if (file.isFile()) {
					String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
					hash.put("is_dir", false);
					hash.put("has_file", false);
					hash.put("filesize", file.length());
					hash.put("is_photo", Arrays.<String> asList(fileTypes).contains(fileExt)); // 文件类型
					hash.put("filetype", fileExt);
				}
				hash.put("filename", fileName);
				hash.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));
				fileList.add(hash);
			}
		}
		// 这是在做什么 ？？？ 创建一个Map 集合 里面的东西 都是什么？》？？？ 有什么作用？？
		Map<String, Object> result = new HashMap<>();
		result.put("moveup_dir_path", "");
		result.put("current_dir_path", rootPath);
		result.put("current_url", rootUrl);
		result.put("total_count", fileList.size());
		result.put("file_list", fileList);
		ActionContext.getContext().getValueStack().push(result);

		return SUCCESS;

	}

}
